class CustomRegexUtil {

  /// 手机号码的正则表达式
  /// <p>中国移动: 134(0-8), 135, 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 178, 182, 183, 184, 187, 188, 198</p>
  /// <p>中国联通: 130, 131, 132, 145, 155, 156, 166, 171, 175, 176, 185, 186</p>
  /// <p>中国电信: 133, 153, 173, 177, 180, 181, 189, 199</p>
  /// <p>全球: 1349</p>
  /// <p>虚拟运营商: 170</p>
  static const String regexMobileExact = '^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(16[6])|(17[0,1,3,5-8])|(18[0-9])|(19[1,8,9]))\\d{8}\$';

  /// 电话号码的正则表达式
  static const String regexTel = '^0\\d{2,3}[- ]?\\d{7,8}';

  /// 身份证号码的正则表达式，长度为15。
  static const String regexIdCard15 = '^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}\$';

  /// 身份证号码的正则表达式，长度为18。
  static const String regexIdCard18 = '^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9Xx])\$';

  /// 电子邮件的正则表达式。
  static const String regexEmail = '^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*\$';

  /// url的正则表达式.
  static const String regexUrl = '[a-zA-Z]+://[^\\s]*';

  /// 汉字正则表达式。
  static const String regexZh = '[\\u4e00-\\u9fa5]';

  /// 日期的正则表达式，模式为“yyyy-MM-dd”。
  static const String regexDate =
      '^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)\$';

  /// ip地址的正则表达式。
  static const String regexIp =
      '((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)';

  /// 必须包含字母和数字, 6~18.
  static const String regexUsername =
      '^(?![0-9]+\$)(?![a-zA-Z]+\$)[0-9A-Za-z]{6,18}\$';

  /// 必须包含字母和数字,可包含特殊字符 6~18.
  static const String regexUsername2 =
      '^(?![0-9]+\$)(?![a-zA-Z]+\$)[0-9A-Za-z\\W]{6,18}\$';

  /// 必须包含字母和数字和殊字符, 6~18.
  static const String regexUsername3 =
      '^(?![0-9]+\$)(?![a-zA-Z]+\$)(?![0-9a-zA-Z]+\$)(?![0-9\\W]+\$)(?![a-zA-Z\\W]+\$)[0-9A-Za-z\\W]{6,18}\$';

  /// QQ号码的正则表达式。
  static const String regexQQ = '[1-9][0-9]{4,}';

  /// 中国邮政编码的正则表达式。
  static const String regexChinaPostalCode = "[1-9]\\d{5}(?!\\d)";


  /// 银行卡号正则表达式
  static const String regexBankAccount = '^([1-9]{1})(\\d{14}|\\d{15}|\\d{16}|\\d{18})\$';

  /// 企业电话正则表达式
  static const String regexBusinessPhone = '^\\d{3}\\d{8,9}\$';

  static bool isBusinessPhone(String input) {
    return matches(regexBusinessPhone, input);
  }

  static bool isBankAccount(String input) {
    return matches(regexBankAccount, input);
  }

  static bool isMobileExact(String input) {
    return matches(regexMobileExact, input);
  }

  static bool isTel(String input) {
    return matches(regexTel, input);
  }

  static bool isIDCard15(String input) {
    return matches(regexIdCard15, input);
  }

  static bool isIDCard18(String input) {
    return matches(regexIdCard18, input);
  }

  static bool isEmail(String input) {
    return matches(regexEmail, input);
  }

  static bool isURL(String input) {
    return matches(regexUrl, input);
  }

  static bool isZh(String input) {
    return '〇' == input || matches(regexZh, input);
  }

  static bool isDate(String input) {
    return matches(regexDate, input);
  }

  static bool isIP(String input) {
    return matches(regexIp, input);
  }

  static bool isUserName(String input, {String regex = regexUsername}) {
    return matches(regex, input);
  }

  static bool isQQ(String input) {
    return matches(regexQQ, input);
  }

  static bool matches(String regex, String input) {
    if (input == "" || input.isEmpty) return false;
    return RegExp(regex).hasMatch(input);
  }

}